package com.systop.asset.utils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 随机编码生成工具类
 */
public class RandomCodeGenerator {

    private static final String ASSET_PREFIX = "ZC";
    private static final String BATCH_PREFIX = "PC";
    private static final String TRANSFER_PREFIX = "DB";
    private static final String FIX_PREFIX = "WX";
    private static final String DISPOSAL_PREFIX = "CZ";
    private static final String DATE_FORMAT = "yyyyMMdd";
    private static final String DATETIME_FORMAT = "yyyyMMddHHmmss";
    private static final Random random = new Random();
    /**
     * 生成处置单编码
     * 格式：DB + 年月日 + 6位随机数 (示例：DB20230702012345)
     *
     * @return 生成的调拨单编码
     */
    public static String generateDisposalCode() {
        // 获取当前日期并格式化为yyyyMMdd格式
        String datePart = LocalDate.now().format(DateTimeFormatter.ofPattern(DATE_FORMAT));
        // 生成6位随机数，不足前面补0
        String randomPart = String.format("%06d", random.nextInt(999999));
        // 拼接前缀、日期和随机数部分
        return String.join("",DISPOSAL_PREFIX , datePart, randomPart);
    }
    /**
     * 生成调拨单编码
     * 格式：DB + 年月日 + 6位随机数 (示例：DB20230702012345)
     *
     * @return 生成的调拨单编码
     */
    public static String generateTransferCode() {
        // 获取当前日期并格式化为yyyyMMdd格式
        String datePart = LocalDate.now().format(DateTimeFormatter.ofPattern(DATE_FORMAT));
        // 生成6位随机数，不足前面补0
        String randomPart = String.format("%06d", random.nextInt(999999));
        // 拼接前缀、日期和随机数部分
        return String.join("", TRANSFER_PREFIX, datePart, randomPart);
    }

    /**
     * 生成维修单编码
     * 格式：WX + 年月日 + 6位随机数 (示例：DB20230702012345)
     *
     * @return 生成的维修单编码
     */
    public static String generateFixCode() {
        // 获取当前日期并格式化为yyyyMMdd格式
        String datePart = LocalDate.now().format(DateTimeFormatter.ofPattern(DATE_FORMAT));
        // 生成6位随机数，不足前面补0
        String randomPart = String.format("%06d", random.nextInt(999999));
        // 拼接前缀、日期和随机数部分
        return String.join("", FIX_PREFIX, datePart, randomPart);
    }

    /**
     * 生成资产编码
     * 格式：ZC-年月日-6位随机数 (示例：ZC20230628123456)
     *
     * @return 生成的资产编码
     */
    public static String generateAssetCode() {
        String datePart = LocalDate.now().format(DateTimeFormatter.ofPattern(DATE_FORMAT));
        String randomPart = String.format("%06d", random.nextInt(999999));
        return String.join("", ASSET_PREFIX, datePart, randomPart);
    }

    /**
     * 生成批次号
     * 格式：PC-年月日时分秒 (示例：PC20230628143025)
     *
     * @return 生成的批次号
     */
    public static String generateBatchNumber() {
        String datetimePart = LocalDateTime.now().format(DateTimeFormatter.ofPattern(DATETIME_FORMAT));
        return String.join("", BATCH_PREFIX, datetimePart);
    }

    /**
     * 生成自定义前缀的随机编码
     * 格式：前缀-年月日-6位随机数 (示例：CUST-20230628-123456)
     *
     * @param prefix 编码前缀
     * @return 生成的随机编码
     */
    public static String generateCustomCode(String prefix) {
        String datePart = LocalDate.now().format(DateTimeFormatter.ofPattern(DATE_FORMAT));
        String randomPart = String.format("%06d", random.nextInt(999999));
        return String.join("-", prefix, datePart, randomPart);
    }

    /**
     * 生成纯数字随机编码
     *
     * @param length 编码长度
     * @return 纯数字随机编码
     */
    public static String generateNumericCode(int length) {
        if (length <= 0) {
            throw new IllegalArgumentException("编码长度必须大于0");
        }

        int min = (int) Math.pow(10, length - 1);
        int max = (int) Math.pow(10, length) - 1;
        return String.valueOf(ThreadLocalRandom.current().nextInt(min, max + 1));
    }

    /**
     * 生成混合随机编码（字母+数字）
     *
     * @param length 编码长度
     * @return 混合随机编码
     */
    public static String generateMixedCode(int length) {
        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(chars.charAt(random.nextInt(chars.length())));
        }
        return sb.toString();
    }
}
